package cn.com.klun.tjy.other.util;


import org.apache.commons.lang3.StringUtils;

import java.util.*;

/**
 * 根据规则生成AppKey
 * UUID,每四个字节分段，每个字符值相加，取后4bitHex值正序追加在尾部，UUID前面追加 "10"
 */
public class AppKeyUtil {

    private static final Map<Character, Integer> hexMap = new HashMap<>();

    static {
        hexMap.put('0', 0);
        hexMap.put('1', 1);
        hexMap.put('2', 2);
        hexMap.put('3', 3);
        hexMap.put('4', 4);
        hexMap.put('5', 5);
        hexMap.put('6', 6);
        hexMap.put('7', 7);
        hexMap.put('8', 8);
        hexMap.put('9', 9);
        hexMap.put('A', 10);
        hexMap.put('a', 10);
        hexMap.put('B', 11);
        hexMap.put('b', 11);
        hexMap.put('C', 12);
        hexMap.put('c', 12);
        hexMap.put('D', 13);
        hexMap.put('d', 13);
        hexMap.put('E', 14);
        hexMap.put('e', 14);
        hexMap.put('F', 15);
        hexMap.put('f', 15);
    }

    /**
     * 生成secretKey
     *
     * @return
     */
    public static String get() {
        String s = UUID.randomUUID().toString().replace("-", "");
        return generate(s);
    }

    /**
     * 验证secretKey是否有效
     *
     * @param appKey
     * @return
     */
    public static boolean verify(String appKey) {
        if (StringUtils.isBlank(appKey) || appKey.length() != 42) {
            return false;
        } else {
            return generate(appKey.substring(2, 34)).equals(appKey);
        }
    }

    private static String generate(String uuid) {
        StringBuffer prefix = new StringBuffer("10");
        prefix.append(uuid);

        List<Integer> hexs = new ArrayList<>();

        int sum = 0;
        System.out.println("UUID.length : "+uuid.length());
        for (int i = 1; i <= uuid.length(); i++) {
            sum += hexMap.get(uuid.charAt(i - 1));
            if (i % 4 == 0) {
                hexs.add(sum);
                sum = 0;
            }
        }
        Collections.sort(hexs, (a, b) -> a.compareTo(b));
        for (Integer i : hexs) {
            prefix.append(Integer.toHexString(i & 0XF));
        }
        return prefix.toString();
    }

    public static void main(String[] args) {
        String uuid = get();

        System.out.println("uuid : " + uuid.toString());

        String generate = generate(uuid.toString());
        System.out.println("generate : " + generate);
    }

}

